package main

import "fmt"

func main() {

	// slice 切片
	// 切片是一个动态数组 3个部分组成
	// 指向底层数组的指针 切片的元素个数  长度 切片的容量
	// 引用类型

	// 1.0切片的定义
	var sliceVariable1 []int
	// 定义一个数组
	var arrayVariable1 [5]int = [5]int{1, 2, 3, 4, 5}

	// 打印一下
	for i := 0; i < len(arrayVariable1); i ++ {
		fmt.Printf("arrayVariable1[%d]=%d, 地址是:%p\n", i, arrayVariable1[i], &arrayVariable1[i])
	}

	// 切片去引用数组
	sliceVariable1 = arrayVariable1[:]

	for i := 0; i < len(sliceVariable1); i ++ {
		fmt.Printf("sliceVariable1[%d]=%d, 地址是:%p\n", i, sliceVariable1[i], &sliceVariable1[i])
	}

	var sliceVariable2 = arrayVariable1[1:3]
	for i := 0; i < len(sliceVariable2); i ++ {
		fmt.Printf("sliceVariable2[%d]=%d, 地址是:%p\n", i, sliceVariable2[i], &sliceVariable2[i])
	}

	// 切片是指向底层数组的指针 改变切片 数组也会跟着改
	sliceVariable2[0] = 100
	fmt.Println(arrayVariable1)
	fmt.Println(sliceVariable2)

	// 第二种定义方法 make
	var sliceVariable3 []int = make([]int, 5, 6) // 类型 长度  容量
	fmt.Printf("sliceVariable3的长度:%d, 容量:%d, 切片指向底层数组的地址:%p，切片自己的地址:%p\n", len(sliceVariable3), cap(sliceVariable3), sliceVariable3, &sliceVariable3)

	// append
	sliceVariable3 = append(sliceVariable3, 10)
	fmt.Printf("第一次追加sliceVariable3的长度:%d, 容量:%d, 切片指向底层数组的地址:%p，切片自己的地址:%p\n", len(sliceVariable3), cap(sliceVariable3), sliceVariable3, &sliceVariable3)

	sliceVariable3 = append(sliceVariable3, 11)
	fmt.Printf("第二次追加sliceVariable3的长度:%d, 容量:%d, 切片指向底层数组的地址:%p，切片自己的地址:%p\n", len(sliceVariable3), cap(sliceVariable3), sliceVariable3, &sliceVariable3)

	// copy
	sliceVariable4 := []int{1, 2, 3, 4, 5}
	sliceVariable5 := make([]int, 6, 10)
	fmt.Println(sliceVariable4)
	fmt.Println(sliceVariable5)

	copy(sliceVariable5, sliceVariable4)

	fmt.Println(sliceVariable4)
	fmt.Println(sliceVariable5)

	// 切片是引用类型
	change(sliceVariable5)
}

func change(slice []int) {
	slice[0] = 100
}